package com.fy.fyspace.controller;

import com.fy.fyspace.common.annotation.GlobalInterceptor;
import com.fy.fyspace.common.auth.StpKit;
import com.fy.fyspace.common.auth.annotation.SpaceAuth;
import com.fy.fyspace.common.result.R;
import com.fy.fyspace.constant.KeysConstant;
import com.fy.fyspace.model.vo.space.SpaceDetailVO;
import com.fy.fyspace.model.vo.user.UserSessionVO;
import com.fy.fyspace.service.SpaceUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import static com.fy.fyspace.common.result.R.ok;

/**
 * 团队空间用户控制器
 * 处理团队空间用户相关的请求，包括登录、获取信息、创建和加入团队空间等操作
 *
 * @author fwq
 */
@RestController
@Slf4j
@Api(tags = "团队空间用户模块接口")
@RequestMapping("/teamSpaceUser")
public class SpaceUserController {

    @Resource
    private SpaceUserService spaceUserService;

    /**
     * 团队空间用户登录
     * 使用当前会话中的用户信息进行团队空间系统的登录
     *
     * @param httpSession HTTP会话对象，用于获取当前登录用户信息
     * @return 登录结果
     */
    @PostMapping("/login")
    @GlobalInterceptor
    @ApiOperation(value = "团队空间用户登录", notes = "使用当前会话中的用户信息进行团队空间系统的登录")
    public R spaceUserLogin(HttpSession httpSession) {
        UserSessionVO userSessionVO = (UserSessionVO) httpSession.getAttribute(KeysConstant.LOGIN_SESSION_KEY);
        Long userId = userSessionVO.getId();
        return spaceUserService.login(userId);
    }

    /**
     * 获取团队空间信息
     * 获取当前用户创建的或加入的所有团队空间信息
     *
     * @param httpSession HTTP会话对象，用于获取当前登录用户信息
     * @return 团队空间信息列表
     */
    @GetMapping("/getTeamSpaceInfo")
    @ApiOperation(value = "获取团队空间信息", notes = "获取当前用户创建的或加入的所有团队空间信息")
    public R getTeamSpaceInfo(HttpSession httpSession) {
        UserSessionVO userSessionVO = (UserSessionVO) httpSession.getAttribute(KeysConstant.LOGIN_SESSION_KEY);
        Long userId = userSessionVO.getId();
        StpKit.SPACE.login(userId);
        return spaceUserService.getTeamSpaceInfo(userId);
    }

    /**
     * 创建团队空间
     * 为当前用户创建一个新的团队空间，每个用户只能创建一个团队空间
     *
     * @param httpSession HTTP会话对象，用于获取当前登录用户信息
     * @return 创建结果
     */
    @PostMapping("/createTeamSpace")
    @GlobalInterceptor
    @SpaceAuth
    @ApiOperation(value = "创建团队空间", notes = "为当前用户创建一个新的团队空间，每个用户只能创建一个团队空间")
    public R createTeamSpace(HttpSession httpSession) {
        UserSessionVO userSessionVO = (UserSessionVO) httpSession.getAttribute(KeysConstant.LOGIN_SESSION_KEY);
        return spaceUserService.createTeamSpace(userSessionVO);
    }

    /**
     * 加入团队空间
     * 加入指定ID的团队空间，用户最多可以加入3个其他用户创建的团队空间
     *
     * @param spaceId     要加入的团队空间ID
     * @param httpSession HTTP会话对象，用于获取当前登录用户信息
     * @return 加入结果
     */
    @PostMapping("/joinTeamSpace")
    @GlobalInterceptor
    @ApiOperation(value = "加入团队空间", notes = "加入指定ID的团队空间，用户最多可以加入3个其他用户创建的团队空间")
    public R joinTeamSpace(
            @ApiParam(value = "团队空间ID", required = true) @RequestParam Long spaceId,
            HttpSession httpSession) {
        UserSessionVO userSessionVO = (UserSessionVO) httpSession.getAttribute(KeysConstant.LOGIN_SESSION_KEY);
        return spaceUserService.joinTeamSpace(spaceId, userSessionVO);
    }

    /**
     * 获取空间详细信息
     * 包括空间基本信息、成员统计、文件统计、活动统计等
     *
     * @param spaceId 空间ID
     * @return 空间详细信息
     */
    @GetMapping("/detail/{spaceId}")
    @ApiOperation(value = "获取空间详细信息", notes = "获取空间的详细信息，包括统计数据和成员列表")
    public R<SpaceDetailVO> getSpaceDetail(@PathVariable Long spaceId) {
        Long userId = StpKit.SPACE.getLoginIdAsLong();
        log.info("获取空间详细信息: spaceId={}, userId={}", spaceId, userId);
        SpaceDetailVO detail = spaceUserService.getSpaceDetail(spaceId, userId);
        return ok(detail);
    }

}
